package test.hash;

/**
 * 哈希算法(jdk hashcode)
 *
 * 为啥使用"31"为乘子:
 *      1. 质数,数学可证明质数可减少哈希冲突; 主要是质数就算溢出还能继续保持混乱性, 像2溢出直接就变成0了直接导致哈希冲突;
 *      2. 不大不小, 太小如3,7,11等导致n比较小的时候f(n)过于密集导致冲突率大; 太大则影响计算效率;
 *      3. 31*i = (i<<5) -i  // 速度快,简直太妙
 */
public class HashUtil {
    private static int hash = 0;

    public static int hash(byte[] object) {
        // hash成员起到缓存的作用
        if (hash == 0) {
            for (byte value : object) {
                hash = 31 * hash + value;
            }
        }
        return hash;
    }

    public static int hash(char[] object) {
        int hash = 0;
        for (char value : object) {
            hash = 31 * hash + value;
        }
        return hash;
    }
}
